Content Security Policy (CSP)
Reining in the Web with Content Security Policyという論文で発表
CSPの主なモチベーションは、XSSなどのContent Injectionの根絶
一般的にContent Injectionを防ぐのは難しい
攻撃者は隙間を見つけてscriptを埋め込んでくる
基本的にBrowserは、resourceの送信元を信頼する
もし悪意のあるscriptが送られてきたら実行してしまう
対策としては、Webページ中に、攻撃者の指定した文字列を表示できなくすればいい
しかし、Browser目線では、
どれが正当な開発者の用意したscriptで、
どれが攻撃者が仕込んだscrpitなのか
を判断する術がない
そこで、例えばresourceの取得に制限を設ける
Content Injectionのあるある攻撃ポイントに対して項目がある感じ
例えば
指定していないoriginからはscriptをfetchしない
こういう制限をfontとかcssとか画像とかにも設けられる
scriptタグ内のscriptは実行しない
そもそもJSを実行させない
「こういう制限のもとで作ってまっせ」ということをserverがheader経由でbrowserに伝える
「この辺のものは最初から使わないよ」と宣言している感じ
制限に違反したものは攻撃者のscriptだと判定してブロックすることができる
directiveの構造
CSPには多くのdirective setが用意されている
ざっと30種類ぐらいあるmrsekut.icon
Content-Security-Policy:という1つのheaderに対して、複数のkey value;を指定することになる
例 Strict CSP
例えばobject-srcとかscript-srcというkeyがあって、それぞれに対応するvalueを指定する
valueはソースリスト
dircetiveはざっくり5つに分類されている
directiveの分類
Fetch Directive
Document Directive
Navigation Directive
Reporting Directive
Others Dirctive
CSP: upgrade-insecure-requests
CSP: require-sri-for
CSP: require-trusted-types-for
CSP: trusted-types
結局何を指定すればいいのか?
Strict CSPを参考にする
計測する
CSP Evaluator
参考
/mrsekut-book-4908686106/075
概要や、各directiveの解説
#WIP
https://zenn.dev/legalscape/articles/73bfec20786fce
https://developer.mozilla.org/ja/docs/Web/HTTP/CSP
概要
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy
ヘッダ関連
https://developers.google.com/web/fundamentals/security/csp?hl=ja
https://zenn.dev/team_zenn/articles/introduced-csp-to-zenn
指定する方法は2つ
response header
response body内のmetaタグ
CSPはコンテンツを取得する側が読み込むコンテンツを制限するために設定するのに対し、CORSはコンテンツを提供する側がアクセス権を与える先を制限するために設定するものです。ref
https://qiita.com/yuria-n/items/c50a1bc0ba51f6e33215
以下のような攻撃の対策になる
XSS
Data Injection攻撃
Next.jsでCSPの設定
https://kotamat.com/post/nextjs-strict-csp/
https://nextjs.org/docs/advanced-features/security-headers
https://sunday-morning.app/posts/2020-12-06-next-js-content-security-policy
https://github.com/vercel/next.js/tree/canary/examples/with-strict-csp
CSPへ至る歴史
BEEP
Browser-Enforced Embedded Policies
afterParseHookという関数を用意しておき、
ブラウザがJSをparseしたあとに、その関数を適用して、実行の許可をしたりする仕組み
これでは不十分で、Return To JavaScript攻撃を受ける
SOMA
Same Origin Mutual Approval
Noncespaces